// push
let arr = [1, 2, 3]
arr.push(4)
console.log('push：', arr) // [1, 2, 3, 4]

// unshift
let arr1 = [1, 2, 3]
arr1.unshift(4)
console.log('unshift：', arr1) // [4, 1, 2, 3]

// pop
let arr2 = [1, 2, 3]
arr1.pop()
console.log('pop：', arr2) // [1, 2, 3]

// shift
let arr3 = [1, 2, 3]
const value = arr3.shift()
console.log('shift：', value, arr3, arr3.length) // 1 [ 2, 3 ] 2

// slice
let arr4 = [1, 2, 3, 4, 5, 6, 7]
let value1 = arr4.slice(3, 6)
console.log('slice：', value1) // [)原数组不变：[4, 5, 6]

// splice
let arr5 = [1, 2, 3, 4, 5, 6, 7]
// 0个参数
// arr5.splice()
// console.log('splice：', arr5) // [1, 2, 3, 4, 5, 6, 7]
// 1个参数
// let value2 = arr5.splice(1)
// console.log('splice：', value2, arr5) // [ 2, 3, 4, 5, 6, 7 ] [ 1 ]
// 2个参数
// let value2 = arr5.splice(3, 2) // 第二个参数是长度 
// console.log('splice：', value2, arr5) // [ 4, 5 ] [ 1, 2, 3, 6, 7 ]
// 3个或者以上的参数
let value2 = arr5.splice(3, 2, 8, 9, 10) // 第一个是索引， 第二个是长度，第三个及以上是插入的值 8， 9， 10代替截取之后的4，5
console.log('splice：', value2, arr5) // [ 4, 5 ] [1, 2, 3, 8, 9, 10, 6, 7]

// reverse
let arr6 = [1, 2, 3]
arr6.reverse()
console.log('reverse：', arr6) // [3, 2, 1]

// sort
let arr7 = [4, 6, 3, 7, 1, 2, 5]
// arr7.sort()
// arr7.sort((a, b) => b-a) //逆序
arr7.sort((a, b) => a-b) //顺序
console.log('sort - arr7：', arr7) // [1, 2, 3, 4, 5, 6, 7]

// join
let arr8 = [1, 2, 3, 4]
let value3 = arr8.join('~')
console.log('join：', value3, arr8) // 1~2~3~4 [ 1, 2, 3, 4 ]

// concat
let arr9 = [1, 2, 3, 4];
let value4 = arr9.concat([5, 6, 7])
console.log('Concat：', value4, arr9) // [1, 2, 3, 4, 5, 6, 7]  [ 1, 2, 3, 4 ]

// indexOf
let arr10 = [1, 2, 3, 4]
console.log(arr10.indexOf(1)) //0 返回当前索引
console.log(arr10.indexOf(11)) // -1

// forEach
let arr11 = [1, 2, 3, 4, 5, 6, 7]
arr11.forEach((item, index, arr) => {
  // item 值 index 索引 arr 为数组名字
  console.log('forEach：', item, index, arr)
})

// map
let arr12 = [11, 12, 13, 14, 15, 16]
let value5 = arr12.map((item, index) => {
  item = item + index
  return item
})
console.log(arr12, value5)  // [ 11, 12, 13, 14, 15, 16 ] [ 11, 13, 15, 17, 19, 21 ]

// filter
let arr13 = [21, 14, 56, 23, 77]
let value6 = arr13.filter((item , index) => item > 30)
console.log('filter：', arr13, value6)  // [ 21, 14, 56, 23, 77 ] [ 56, 77 ]

// some
let arr14 = ['oyc', 'yrq', 'kw', 'tiger']
let value7 = arr14.some(item => item.indexOf('yrq') > -1)
console.log('some：', arr14, value7) // [ 'oyc', 'yrq', 'kw', 'tiger' ] true

// every
let arr15 = [12, 4, 6, 7, 90]
// let value8 = arr15.every(item => item > 1) // [ 12, 4, 6, 7, 90 ] true
let value8 = arr15.every(item => item > 10) // [ 12, 4, 6, 7, 90 ] false
console.log('every：', arr15, value8)

// reduce
let arr16 = [12, 13, 14, 15]
let sums = arr16.reduce((total, currentValue, currentIndex, arr) => {
  return total + currentValue
})
console.log('reduce：', arr16, sums) // [ 12, 13, 14, 15 ] 54

// Array.from() 1. 将类数组对象转换为真正数组：
console.log('%s', Array.from([1, 2, 3, 4, 5], (n) => n + 1))  // [ 2, 3, 4, 5, 6 ]
let array17 = {
  0: 'tom', 
  1: '65',
  2: '男',
  3: ['jane','john','Mary'],
  'length': 4
  }
let value9 = Array.from(array17)
console.log(value9) // ['tom','65','男',['jane','john','Mary']]
// Array.from() 2. 将Set结构的数据转换为真正的数组
let arr18 = [12,45,97,9797,564,134,45642]
let set = new Set(arr18)
console.log(set, Array.from(set))  // [ 12, 45, 97, 9797, 564, 134, 45642 ]
// 将字符串转换为数组
let str = 'hello'
console.log(Array.from(str)) // ['h', 'e', 'l', 'l', '0']

// Array.of()
console.log('Array.Of()：', Array.of(1, 2, 3, '4', 'name')) // [1, 2, 3, '4', 'name']

// find()
console.log('find()：', [1, 2, 3, 4, 5, 2].find(item => item == 2)) // 2

// findIndex
console.log('findIndex()：', [1, 2, 3, 4].findIndex(item => item == 2)) // 索引：1

// includes()
console.log('includes()：', [1, 2, 3].includes(1)) // true

// fill()
let arr20 = [1, 2, 3]
// 参数1：用来填充的值 参数2：被填充的起始索引  参数3(可选)：被填充的结束索引，默认为数组末尾
console.log('fill()：', arr20.fill(0, 1, 2))  // [1, 0, 3]

// entries()
for(let [key, value] of ['a', 'b'].entries()){
  console.log('entries()：',key, value);
}
// 0 "a"
// 1 "b" 
// 不使用 for... of 循环
let entries = ['a', 'b'].entries();
console.log(entries.next().value); // [0, "a"]
console.log(entries.next().value); // [1, "b"]
// 数组含空位
console.log([...[,'a'].entries()]); // [[0, undefined], [1, "a"]]


// keys()
for(let key of ['a', 'b'].keys()){
  console.log(key);
}
// 0
// 1 
// 数组含空位
console.log([...[,'a'].keys()]); // [0, 1]

// values
for(let value of ['a', 'b'].values()){
  console.log(value);
}
// "a"
// "b"
// 数组含空位
console.log([...[,'a'].values()]); // [undefined, "a"]

// flat()
console.log([1 ,[2, 3]].flat()); // [1, 2, 3] 
// 指定转换的嵌套层数
console.log([1, [2, [3, [4, 5]]]].flat(2)); // [1, 2, 3, [4, 5]] 
// 不管嵌套多少层
console.log([1, [2, [3, [4, 5]]]].flat(Infinity)); // [1, 2, 3, 4, 5]
// 自动跳过空位
console.log([1, [2, , 3]].flat()); // [1, 2, 3]




